package com.warm.test.file;

import cn.dev33.satoken.annotation.SaIgnore;
import com.warm.core.utils.file.FileUploadUtils;
import org.noear.solon.annotation.*;
import org.noear.solon.core.handle.Context;
import org.noear.solon.core.handle.DownloadedFile;
import org.noear.solon.core.handle.UploadedFile;
import org.noear.solon.validation.annotation.Valid;

import java.io.*;
import java.nio.charset.StandardCharsets;

@SaIgnore
@Mapping("/demo/file")
@Valid
@Controller
public class FileController {
    @Inject("${warm.profile}")
    String profile;

    // 文件上传
    @Post
    @Mapping("/upload1")
    public String upload(UploadedFile file) throws IOException { // 表单变量名要跟参数名对上
        return FileUploadUtils.upload(file); // 把它转为本地文件
    }

    // // 文件上传
    // @Post
    // @Mapping("/upload2")
    // public String upload(UploadedFile[] file) { // 同名多文件 //v2.3.8 后支持
    //     file.transferTo(new File("/demo/user/logo.jpg")); // 把它转为本地文件
    //     return file.getName();
    // }

    // 通过 multipart 提交的数据，且不带 UploadedFile 参数；须加 multipart 申明
    @Post
    @Mapping(path = "/upload3", multipart = true)
    public String upload(String user) {
        return user;
    }

    // 通过 multipart 提交的数据，且不带 UploadedFile 参数；须加 multipart 申明
    @Post
    @Mapping(path = "/upload4", multipart = true)
    public String upload(String user, Context ctx) throws IOException {
        UploadedFile file = ctx.file("file"); // UploadedFile[] file= ctx.files("file"); 同名多文件
        return file.getName();
    }

    // 文件下载
    @Get
    @Mapping("/down")
    public DownloadedFile down() {
        // 输出的文件名，可以自己指定
        byte[] bytes = "{\"code\":1}".getBytes(StandardCharsets.UTF_8);
        return new DownloadedFile("text/json", bytes, "test.json");
    }

    // 文件下载
    @Get
    @Mapping("/down2")
    public File down2() {
        // 输出的文件名，为 File 的文件名
        return new File(profile + "/logo.jpg");
    }

    // 文件下载
    @Get
    @Mapping("/down2_2")
    public void down2_2(Context ctx) throws IOException {
        // 输出的文件名，为 File 的文件名
        File file = new File(profile + "/logo.jpg");

        ctx.outputAsFile(file);
    }

    // 文件下载
    @Get
    @Mapping("/down3")
    public DownloadedFile down3() throws FileNotFoundException {
        // 输出的文件名，可以自己指定
        InputStream stream = new FileInputStream(new File(profile + "/logo.jpg"));
        return new DownloadedFile("image/jpg", stream, "logo-new.jpg");
    }

    // 文件下载
    @Get
    @Mapping("/down3_2")
    public void down3_2(Context ctx) throws IOException {
        // 输出的文件名，可以自己指定
        InputStream stream = new FileInputStream(new File(profile + "/logo.jpg"));
        DownloadedFile file = new DownloadedFile("image/jpg", stream, "logo-new.jpg");

        ctx.outputAsFile(file);
    }
}    